#ifndef _MyFFT_H_
#define _MyFFT_H_
 
/******************************************************************************
* 文件       ：    MFFT.h
* 作者       ：    dhs
* 版本       ：    V1.0
* 日期       ：    2020-7-14
* 描述       ：    实现快速傅里叶变换的功能（fft）
*                  公式：
******************************************************************************/
#include <stdint.h>
 
#define twoPi 6.28318531
#define fourPi 12.56637061
#define sixPi 18.84955593
 
/* 窗口类型 */
enum  WinType
{
    FFT_WIN_TYP_RECTANGLE=0      ,//  矩形窗
    FFT_WIN_TYP_HAMMING          ,//  汉明窗
    FFT_WIN_TYP_HANN             ,//  汉宁窗
    FFT_WIN_TYP_TRIANGLE         ,//  三角形窗
    FFT_WIN_TYP_NUTTALL          ,//  nuttall窗 
    FFT_WIN_TYP_BLACKMAN         ,//  布莱克曼窗
    FFT_WIN_TYP_BLACKMAN_NUTTALL ,//  blackman nuttall
    FFT_WIN_TYP_BLACKMAN_HARRIS  ,//  blackman harris
    FFT_WIN_TYP_FLT_TOP          ,//  flat top
    FFT_WIN_TYP_WELCH            ,//  welch
 
};
 
struct MFFT
{  
    /*变量区*/                  
    uint16_t _samples;                                                                 //采样信号长度  输入数据的个数 为2的n次方
	float _samplingFrequency;                                                          //采样频率
	float *_vReal;                                                                     //实部值  输出时用于保存幅值
	float *_vImag;                                                                     //虚部值  输出时用于保存频率的值
	uint8_t _power;                                                                    //2的n次方  n的值
    float _step;                                                                       //表示输出每一值之间的频率步长
    float _revalue;                                                                    //幅值恢复系数
    /*函数方法区*/
    void (*Init)(struct MFFT *self,float *vReal, float *vImag, uint16_t samples, float samplingFrequency);   //初始化                                              //初始化函数
    uint8_t (*Compute)(struct MFFT *self);                                             //fft结果计算
    uint8_t (*Exponent)(struct MFFT *self, uint16_t value);                            //指数
    void (*Windowing)(struct MFFT *self, enum WinType windowType);                     //窗口函数获取
    void (*DCRemoval)(struct MFFT *self);              //去除直流分量
    float (*MajorPeak)(float *vD, uint16_t samples, float samplingFrequency);          //
 
};
 
void MFFT_Create(struct MFFT *self);
 
#endif